package com.uade.empresasdistribuidas.entities;

import java.sql.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

import com.uade.empresasdistribuidas.model.Vehiculo;

@Entity
@Table(name= "Vehiculos") 
public class VehiculoDTO {
	
	@Id
	@GeneratedValue(strategy=GenerationType.TABLE)
	@Column(name="CodigoVehiculo" ,unique = true, nullable = false)
	private Integer codigoVehiculo;
	
	@Column(name="Patente", nullable=false, length=10)
	private String patente;
	
	@Column(name="Nombre", nullable=false, length=30)
	private String nombre;
	
	@Column(name="Marca", nullable=false, length=30)
	private String marca;
	
	@Column(name="Estado", nullable=false, length=30)
	private String estado;
	
	@Column(name="Tipo", nullable=false, length=30)
	private String tipo;
	
	@Column(name="VolumenTransportable", nullable=false)
	private Float volumenTransportable;
	
	@Column(name="FechaDeElaboracion", nullable=false)
	private Date fechaDeElaboracion;
	
	@Column(name="Tara", nullable=false)
	private Float tara;
	
	@Column(name="Peso", nullable=false)
	private Float peso;
	
	@Column(name="Refrigerado", nullable=false)
	private Boolean refrigerado;
	
	@Column(name="libre", nullable=false)
	private Boolean libre;
	
	@Column(name="KmsRecorridos", nullable=false)
	private Float kmRecorridos;
	
	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name="CodigoVehiculo")
	private GarantiaDTO garantia;
	
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name="CodigoVehiculo")
	private List<ControlRealizadoDTO> controles;
	
	@OneToMany(mappedBy = "vehiculo") 
	private List<EnvioLocalDTO> envios;
	
	@Embedded
	private CoordenadaDTO coordenada;
	
	
	@ManyToOne
	@JoinColumn(name="NumeroSucursal")
	private SucursalDTO sucursal;

	public Integer getCodigoVehiculo() {
		return codigoVehiculo;
	}

	public void setCodigoVehiculo(Integer codigoVehiculo) {
		this.codigoVehiculo = codigoVehiculo;
	}

	public String getPatente() {
		return patente;
	}

	public void setPatente(String patente) {
		this.patente = patente;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}


	public String getMarca() {
		return marca;
	}

	public void setMarca(String marca) {
		this.marca = marca;
	}

	public Float getVolumenTransportable() {
		return volumenTransportable;
	}

	public void setVolumenTransportable(Float volumenTransportable) {
		this.volumenTransportable = volumenTransportable;
	}

	public Date getFechaDeElaboracion() {
		return fechaDeElaboracion;
	}

	public void setFechaDeElaboracion(Date fechaDeElaboracion) {
		this.fechaDeElaboracion = fechaDeElaboracion;
	}

	public Float getTara() {
		return tara;
	}

	public void setTara(Float tara) {
		this.tara = tara;
	}

	public Float getPeso() {
		return peso;
	}

	public void setPeso(Float peso) {
		this.peso = peso;
	}

	public Boolean getRefrigerado() {
		return refrigerado;
	}

	public void setRefrigerado(Boolean refrigerado) {
		this.refrigerado = refrigerado;
	}

	public Float getKmRecorridos() {
		return kmRecorridos;
	}

	public void setKmRecorridos(Float kmRecorridos) {
		this.kmRecorridos = kmRecorridos;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public GarantiaDTO getGarantia() {
		return garantia;
	}

	public void setGarantia(GarantiaDTO garantia) {
		this.garantia = garantia;
	}

	public List<ControlRealizadoDTO> getControles() {
		return controles;
	}

	public void setControles(List<ControlRealizadoDTO> controles) {
		this.controles = controles;
	}

	public List<EnvioLocalDTO> getEnvios() {
		return envios;
	}

	public void setEnvios(List<EnvioLocalDTO> envios) {
		this.envios = envios;
	}

	public CoordenadaDTO getCoordenada() {
		return coordenada;
	}

	public void setCoordenada(CoordenadaDTO coordenada) {
		this.coordenada = coordenada;
	}

	public SucursalDTO getSucursal() {
		return sucursal;
	}

	public void setSucursal(SucursalDTO sucursal) {
		this.sucursal = sucursal;
	}

	public Float getMaximoPeso() {
		
		return tara+peso;
	}

	public Boolean getLibre() {
		return libre;
	}

	public void setLibre(Boolean libre) {
		this.libre = libre;
	}

	public boolean entraPeso(Float pesoCargas) {
		return pesoCargas<peso+tara;
		
	}

	public boolean estasCasiLleno(Float pesoPedidos) {
		
		return ((peso+tara)*0.7)<=pesoPedidos;
	}

	public boolean estasEnSucursal(SucursalDTO sucursalOrigen) {
		
		return sucursalOrigen.equals(sucursal) && (Vehiculo.EN_SUCURSAL).equals(getEstado());
	}

	
	
	
}
